package com.lmy.springboot.exception;

import lombok.extern.slf4j.Slf4j;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.method.HandlerMethod;

import javax.servlet.http.HttpServletRequest;

/**
 * 这是一个全局异常处理类，使用@ControllerAdvice标识全局异常处理类(自动注入spring容器)，并使用@ExceptionHandler标识要处理指定异常的方法
 * 当发生异常时，底层是通过ExceptionHandlerExceptionResolver支持的
 */
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 编写方法，处理指定异常，比如处理算数异常和空指针异常
     * @param e 表示异常发生后，传递的异常对象
     * @param model 可以将错误信息/异常信息放入model，并传递给显示的页面
     * @param handlerMethod 底层在反射调用该异常处理方法时，还传入了异常发生的方法对象，所以这里可以获取
     * @return
     */
    @ExceptionHandler(value = {ArithmeticException.class, NullPointerException.class})
    public String handleArithmeticException(ArithmeticException e,
                                            Model model,
                                            HandlerMethod handlerMethod) {
        log.info("异常信息={}", e.getMessage());
        //将发生的异常信息放入model，可以在页面取出
        model.addAttribute("msg", e.getMessage());
        log.info("异常发生的位置/方法是={}", handlerMethod.getMethod());
        //因为整个模块被thymeleaf模板引擎接管了，当返回视图时，会调用thymeleaf的视图解析器来寻找返回的页面
        //即template目录下的文件
        return "/error/global";
    }
}
